package single;

public class Lazy01 {
    // 私有构造器
    private Lazy01() {

    }

    // 没有实例化
    private static Lazy01 LAZY;

//    public static Lazy01 getInstance() {
//        if (LAZY == null) {
//            // 在这里加一个断点，并以Thread为标准断
//            LAZY = new Lazy01();
//            // 我们在这里添加一行代码，证明同一个单例被实例化多次
//            System.out.println(Thread.currentThread().getName() + "实例化单例：" + LAZY.hashCode());
//        }
//
//        return LAZY;
//    }

    // 解决同一个单例创建多次的问题
//    public static synchronized Lazy01 getInstance() {
//        if (LAZY == null) {
//            // 在这里加一个断点，并以Thread为标准断
//            LAZY = new Lazy01();
//            // 我们在这里添加一行代码，证明同一个单例被实例化多次
//            System.out.println(Thread.currentThread().getName() + "实例化单例：" + LAZY.hashCode());
//        }
//
//        return LAZY;
//    }

    // 解决效率问题
    public static Lazy01 getInstance() {
        // 双重检测锁
        if (LAZY == null) {
            synchronized (Lazy01.class) {
                if (LAZY == null) {
                    LAZY = new Lazy01();
                }
            }
        }

        return LAZY;
    }


    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            new Thread(() -> {
                Lazy01 singleton = Lazy01.getInstance();
            }).start();
        }
    }
}